/**
 * Implementacion de la clase Parser.
 */

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../logger/logger.hpp"
#include "parser.hpp"


using namespace std;

Parser::Parser(){}

Parser::Parser(std::string &file_parse, std::string &file_conf, Logger *log)
{
	this->quantity		= 0;
	this->logger 		= log;
	int success_conf 	= 0;
	int success_parse	= 0;
	std::string line;
	std::ifstream config_file;

	// Pruebo abrir el archivo a parsear
	this->file_to_parse.open(file_parse.c_str());
	if(!this->file_to_parse)
	{
		this->logger->reportErrorMessage("Parser","contructor","No se pudo abrir el archivo a parsear");
	}
	else{	success_parse = 1;	}

	// Pruebo abrir el archivo de configuración
	config_file.open(file_conf.c_str());
	if(!config_file)
	{
		this->logger->reportErrorMessage("Parser","contructor","No se pudo abrir el archivo de configuracion");
	}
	else{	success_conf = 1;	}

	// Busco el separador
	if(config_file)
	{
		if(getline(config_file, line) != NULL);
		{
			if(strncmp(line.c_str(), "separador:",10) == 0)
				this->separator = line[11];
			else
			{
				this->logger->reportErrorMessage("Parser","contructor","El archivo de configuracion no tiene el formato esperado");
				success_conf = 0;
			}
		}

	}


	if((success_conf)&&(success_parse))
		this->logger->reportSuccessMessage("Parser","contructor","Parser creado");
	else
		this->logger->reportErrorMessage("Parser","contructor","No se pudo crear el Parser");

}

void Parser::create(std::string &file_parse, std::string &file_conf, Logger *log)
{
	this->quantity		= 0;
		this->logger 		= log;
		int success_conf 	= 0;
		int success_parse	= 0;
		std::string line;
		std::ifstream config_file;

		// Pruebo abrir el archivo a parsear
		this->file_to_parse.open(file_parse.c_str());
		if(!this->file_to_parse)
		{
			this->logger->reportErrorMessage("Parser","contructor","No se pudo abrir el archivo a parsear");
		}
		else{	success_parse = 1;	}

		// Pruebo abrir el archivo de configuración
		config_file.open(file_conf.c_str());
		if(!config_file)
		{
			this->logger->reportErrorMessage("Parser","contructor","No se pudo abrir el archivo de configuracion");
		}
		else{	success_conf = 1;	}

		// Busco el separador
		if(config_file)
		{
			if(getline(config_file, line) != NULL);
			{
				if(strncmp(line.c_str(), "separador:",10) == 0)
					this->separator = line[11];
				else
				{
					this->logger->reportErrorMessage("Parser","contructor","El archivo de configuracion no tiene el formato esperado");
					success_conf = 0;
				}
			}

		}


		if((success_conf)&&(success_parse))
			this->logger->reportSuccessMessage("Parser","contructor","Parser creado");
		else
			this->logger->reportErrorMessage("Parser","contructor","No se pudo crear el Parser");

}

Parser::~Parser()
{
	this->file_to_parse.close();
	this->quantity 	= 0;
	this->separator	= 0;
	this->line.clear();
	this->logger->reportSuccessMessage("Parser","destructor","Parser destruido");
}

int Parser::nextLine()
{
	int success 	= 0;
	this->quantity  = 0;

	if (getline(this->file_to_parse, this->line) != NULL)
	{
		this->quantity = 1;
		std::string::iterator it = this->line.begin();
		while( it != this->line.end())
		{
			if(*it == this->separator)
			{
				this->quantity++;
			}
			if( it != this->line.end())
				it++;

		}
	}

	if(this->quantity > 0)
	{
		this->logger->reportSuccessMessage("Parser","next","Linea leida");
		success = 1;
	}
	else
	{
		this->logger->reportErrorMessage("Parser","next","Error al leer linea, Fin de Archivo");
		this->quantity--;
		success = 0;
	}

	return success;
}

int Parser::getNumberOfFields()
{
	return this->quantity;
}

int Parser::getField(int number, std::string &field)
{
	int count 	= 1;
	int success = 1;


	if(number > this->quantity)
		success = 0;

	if(success)
	{
		std::string::iterator it = this->line.begin();
		while((it != this->line.end()) && (count != number))
		{
			if(*it == this->separator)
				count++;
			it++;
		}

		while((it != this->line.end()) && (*it != this->separator))
		{
			field.push_back(*it);
			it++;
		}

		this->logger->reportSuccessMessage("Parser","getField","Campo obenido");
	}

	return success;
}
